/**
 * API请求封装
 * 统一处理请求、响应和错误
 */

const config = require('./config.js');

// 不需要登录就可以访问的公共API列表
const PUBLIC_APIS = [
  config.API.CATEGORY.LIST,
  config.API.CATEGORY.DETAIL,
  config.API.CATEGORY.PRODUCTS,
  config.API.HOME.BANNER,
  config.API.PRODUCT.RECOMMEND,
  config.API.PRODUCT.DETAIL
];

// 判断是否是公共API
function isPublicApi(url) {
  return PUBLIC_APIS.some(api => {
    // 判断是否以某个公共API为前缀，支持带ID的路径，如detail/1
    return url.startsWith(api) || 
           // 如果API以/结尾，则需要移除/再比较
           (api.endsWith('/') && url.startsWith(api.substring(0, api.length - 1)));
  });
}

/**
 * 统一请求函数
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {String} method 请求方法
 * @param {Boolean} loading 是否显示loading
 * @returns {Promise}
 */
function request(url, data = {}, method = 'GET', loading = true) {
  // 完整的请求地址
  const fullUrl = `${config.API_BASE_URL}${url}`;
  
  // 打印详细的请求信息，便于调试
  console.log(`[API请求] ${method} ${fullUrl}`, data);
  
  // 是否显示loading
  if (loading) {
    wx.showLoading({
      title: '加载中...',
      mask: true
    });
  }
  
  // 获取token
  const token = wx.getStorageSync('token');
  
  // 请求头
  const header = {
    'Content-Type': 'application/json'
  };
  
  // 如果不是公共API，则添加token
  if (!isPublicApi(url) && token) {
    header['Authorization'] = `Bearer ${token}`;
  } else {
    console.log(`[API请求] ${url} 是公共API或无token，不添加Authorization头`);
  }
  
  return new Promise((resolve, reject) => {
    wx.request({
      url: fullUrl,
      data: data,
      method: method,
      header: header,
      success: function(res) {
        if (loading) {
          wx.hideLoading();
        }
        
        // 打印详细的响应信息，便于调试
        console.log(`[API响应] ${method} ${fullUrl}`, res);
        
        // 判断请求是否成功
        if (res.statusCode === 200) {
          // 业务状态码判断
          if (res.data.code && res.data.code !== 200 && res.data.code !== 0) {
            // 401: 未登录
            if (res.data.code === 401) {
              // 如果是公共API，不提示登录信息，直接返回数据
              if (isPublicApi(url)) {
                console.log('[API响应] 公共API的401错误，继续处理数据', res.data);
                resolve(res.data);
                return;
              }
              
              console.log('[API响应] 未登录错误，需要登录', res.data);
              wx.showToast({
                title: '请先登录',
                icon: 'none'
              });
              
              // 可以在这里跳转到登录页
              // setTimeout(() => {
              //   wx.navigateTo({
              //     url: '/pages/login/login'
              //   });
              // }, 1500);
            } else {
              // 其他业务错误
              console.log('[API响应] 业务错误', res.data);
              wx.showToast({
                title: res.data.message || '请求失败',
                icon: 'none'
              });
            }
            reject(res.data);
          } else {
            // 请求成功
            resolve(res.data);
          }
        } else {
          // HTTP错误
          const errorMsg = `请求失败: ${res.statusCode}`;
          console.error('[API响应] HTTP错误', errorMsg, res);
          
          if (loading) {
            wx.showToast({
              title: errorMsg,
              icon: 'none'
            });
          }
          
          // 对于公共API的401错误，仍然返回数据
          if (res.statusCode === 401 && isPublicApi(url)) {
            console.log('[API响应] 公共API的HTTP 401错误，继续处理数据', res.data);
            resolve(res.data);
            return;
          }
          
          reject({
            code: res.statusCode,
            message: errorMsg,
            data: res.data
          });
        }
      },
      fail: function(err) {
        if (loading) {
          wx.hideLoading();
        }
        
        console.error('[API请求失败]', err);
        
        const errorMsg = '网络异常，请检查网络连接';
        if (loading) {
          wx.showToast({
            title: errorMsg,
            icon: 'none'
          });
        }
        
        reject({
          code: -1,
          message: errorMsg,
          data: err
        });
      }
    });
  });
}

/**
 * GET请求
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {Boolean} loading 是否显示loading
 * @returns {Promise}
 */
function get(url, data = {}, loading = true) {
  return request(url, data, 'GET', loading);
}

/**
 * POST请求
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {Boolean} loading 是否显示loading
 * @returns {Promise}
 */
function post(url, data = {}, loading = true) {
  return request(url, data, 'POST', loading);
}

/**
 * PUT请求
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {Boolean} loading 是否显示loading
 * @returns {Promise}
 */
function put(url, data = {}, loading = true) {
  return request(url, data, 'PUT', loading);
}

/**
 * DELETE请求
 * @param {String} url 请求地址
 * @param {Object} data 请求参数
 * @param {Boolean} loading 是否显示loading
 * @returns {Promise}
 */
function del(url, data = {}, loading = true) {
  return request(url, data, 'DELETE', loading);
}

// 导出API方法
module.exports = {
  get,
  post,
  put,
  delete: del
}; 